clear;
close all;
syms kpi kii kpu kiu %定义要求解的符号变量
Vs=240; C=780e-6; L=3e-3; R=160; Vdc=400;
fs=20e3;
fcc=fs/20;%电流环穿越频率
wcc=2*pi*fcc;
D=1-Vs/Vdc;
Dp=1-D;
gama=45;
s=wcc*1j;
%Gi_PI=(kpi*s+kii)/s;%电流环PI控制器
Gid=(Vdc*C*s+2*Vdc/R)/((L*C*s^2+(L/R)*s+Dp^2));%从占空比到电感电流的传递函数
abs_Gi_PI=sqrt((kpi*wcc)^2+kii^2)/wcc;%PI控制器模值
ang_Gi_PI=atan(kpi*wcc/kii)-pi/2;%PI控制器相角
%Gid所有变量都知道，因此可以直接用abs和angle函数求模值和相角
abs_Gid=abs(Gid);
ang_Gid=angle(Gid);
%求解kpi与kii 法一：给定PI控制器的转折频率
fcc_pi=fcc/5;%电流环PI控制器的转折频率
wcc_pi=2*pi*fcc_pi;
equ_i=[abs_Gi_PI*abs_Gid==1,kii/kpi==wcc_pi];
PI_i=vpasolve(equ_i,[kpi,kii],[0,1e5;0,1e5]);

% %求解kpi与kii 法二：给定相角裕度
% equ_i=[abs_Gi_PI*abs_Gid==1,ang_Gi_PI+ang_Gid==-(180-gama)/(180/pi)];
% PI_i=vpasolve(equ_i,[kpi,kii]);



s=tf('s');
kpi=double(PI_i.kpi);%符号变量转成double型变量
kii=double(PI_i.kii);%符号变量转成double型变量
Gi_PI=(kpi*s+kii)/s;%电流环PI控制器
Gid=(Vdc*C*s+2*Vdc/R)/((L*C*s^2+(L/R)*s+Dp^2));%从占空比到电感电流的传递函数
Gio=Gi_PI*Gid;
figure(1);
bode(Gi_PI);
hold on
bode(Gid);
bode(Gio);
title('电流环bode图')
legend('PI传递函数','补偿前','补偿后');
set(gcf,'unit','centimeters','position',[20 10 12 10]);


fvc=fcc/10;%电压环穿越频率
wvc=2*pi*fvc;
s=wvc*1j;
gama=45;
Gi_PI=(kpi*s+kii)/s;%电流环PI控制器
Gid=(Vdc*C*s+2*Vdc/R)/((L*C*s^2+(L/R)*s+(1-D)^2));%从占空比到电感电流的传递函数
Gic=Gi_PI*Gid/(1+Gi_PI*Gid);%电流环闭环传递函数
%Gv_PI=(kpu*s+kiu)/s;%电压环PI控制器
Gvi=(Dp^2*R-L*s)/(Dp*R*C*s+2*Dp);%从电感电流到电容电压的传递函数
Gv=Gic*Gvi;%除去PI控制器的电压环开环传递函数，即校正前的电压环开环传递函数
%Gv所有变量都知道，因此可以直接用abs和angle函数求模值和相角
abs_Gv=abs(Gv);
ang_Gv=angle(Gv);
%电压环PI控制器模值与相角
abs_Gv_PI=sqrt((kpu*wvc)^2+kiu^2)/wvc;%PI控制器模值
ang_Gv_PI=atan(kpu*wvc/kiu)-pi/2;%PI控制器相角

%求解kpu与kiu 法一：给定PI控制器的转折频率
fvc_pi=fvc/10;%PI控制器转折频率
wvc_pi=2*pi*fvc_pi;
equ_v=[abs_Gv_PI*abs_Gv==1,kiu/kpu==wvc_pi];
PI_v=vpasolve(equ_v,[kpu,kiu],[0,1e5;0,1e5]);

% %求解kpu与kiu 法二：给定相角裕度
% equ_v=[abs_Gv_PI*abs_Gv==1,ang_Gv_PI+ang_Gv==-(180-gama)/(180/pi)];
% PI_v=vpasolve(equ_v,[kpu,kiu]);

%绘制bode图
s=tf('s');
kpu=double(PI_v.kpu);%符号变量转成double型变量
kiu=double(PI_v.kiu);%符号变量转成double型变量
Gi_PI=(kpi*s+kii)/s;%电流环PI控制器
Gid=(Vdc*C*s+2*Vdc/R)/((L*C*s^2+(L/R)*s+(1-D)^2));%从占空比到电感电流的传递函数
Gic=Gi_PI*Gid/(1+Gi_PI*Gid);%电流环闭环传递函数
Gv_PI=(kpu*s+kiu)/s;%电压环PI控制器
Gvi=(Dp^2*R-L*s)/(Dp*R*C*s+2*Dp);%从电感电流到电容电压的传递函数
Gv=Gic*Gvi;%校正前的电压环开环传递函数
Gvo=Gv_PI*Gv;%校正后的电压环开环传递函数


figure(2);
bode(Gv_PI);%电流环开环传递函数
hold on
bode(Gv);
bode(Gvo);
legend('PI传递函数','补偿前','补偿后');
title('电压环bode图');

set(gcf,'unit','centimeters','position',[30 10 12 10]);

disp(kpi);
disp(kii);
disp(kpu);
disp(kiu);